// client/http_client.rs

// 导入所需的依赖库
use reqwest::{Client, Error, Method, RequestBuilder};  // reqwest 库用于发起 HTTP 请求
use serde::Deserialize;  // serde 库用于数据序列化与反序列化

// 定义一个结构体，用于封装响应的状态码和响应体
#[derive(Deserialize, Debug)]
pub struct Response {
    pub status_code: u16,  // HTTP 状态码
    pub body: String,      // 响应体内容
}

// 发送 HTTP 请求的异步函数
// 参数：method - 请求方法（GET, POST等）、url - 请求的 URL 地址、params - 请求体（如果有）
pub async fn send_request(method: Method, url: &str, params: Option<String>) -> Result<Response, Error> {
    // 创建一个 reqwest 客户端
    let client = Client::new();

    // 初始化请求构建器，根据传入的 method 和 url 创建请求
    let mut request: RequestBuilder = client.request(method, url);

    // 如果有请求体参数（params），将其添加到请求中
    if let Some(data) = params {
        request = request.body(data);  // 设置请求的 body 部分
    }

    // 发送请求并获取响应，使用 .await 等待异步响应
    let response = request.send().await?;

    // 获取 HTTP 响应的状态码，注意此时没有消耗 response
    let status_code = response.status().as_u16();  // 将状态码转换为 u16 类型

    // 获取响应的文本内容（正文），此时会消耗 response，无法再次访问它
    let body = response.text().await?;  // .text() 返回响应体内容作为字符串

    // 构造一个 Response 结构体，包含状态码和响应体
    // 返回的 Result 包含 Response 结构体或错误
    Ok(Response {
        status_code,  // 返回的 HTTP 状态码
        body,         // 返回的响应体内容
    })
}